;	����������� ������� ����������
;	------------------------------
; ��������: 1) �/�-� ����� �������
;	    2) ���������� ���������� ����������
;	    3) �/�-� �������������
;
Nmax	equ	20

;	����������� ������
Old	dd	0			;������� ���������� ������� ���������� 09h
N	db	0			;������� �������� � ������
S	dw	0			;��������� "�����"
F	dw	0			;��������� "��������"
Buf	times	Nmax	db	0       ;�����
SK	db	0
;
;	���� �������
;	------------
; ������: AL - �������� ������ ASCII
;	  ���� CF - ������� ����������, 0 - ���� ������, 1 - ����� ���� 
CharacterEnter:
;���������� � ����������� ����� ����������� ���������
	push	bx
	push	ds
	mov	bx,cs
	mov	ds,bx
;���� ����� ����, �� ��������� �������� ���������� � �����
	cmp	[N],byte 0
	jz	.M3
;��������� ������� �� ������ � ������� AL 
	mov	bx,[S]
	mov	al,[Buf+bx]
;���������� �������� �������� � ���������� ��������� ����� ��� ��������� �� ������ ������
	dec	byte [N]
	cmp	[S],word Nmax-1
	jz	.M1
	inc	word [S]
	jmp	.M2
.M1:	mov	[S],word 0
.M2:	clc
	jmp	.Exit		
.M3:	stc
;�����
.Exit:  pop	ds
	pop	bx
	ret
;
;	������ ������� � ����� ��������
;	-------------------------------
; �����: AL - ������ ��� ������
; ������: ���� CF - 1 - ����� �����, 0 - ����� �� �����
;
WritingCharacterBuffer:
;���������� � ����������� ����� ����������� ���������
	push	ax	
	push	bx
	push	ds
	mov	bx,cs
	mov	ds,bx
;������ ������� �� AL � �����
	mov	bx,[F]
	mov	[Buf+bx],al
;���������� �������� �������� � ���������� ��������� �������� ��� ��������� �� ������ ������
	inc	byte [N]
	cmp	[F],word Nmax-1
	jz	.L1	
	inc	word [F]
	jmp	.L2
.L1:	mov	[F],word 0
.L2:	cmp	[N],byte Nmax
	jz	.L3
	clc
	jmp	.Exit	
.L3:	stc
;�����
.Exit:	pop	ds
	pop	bx
	pop	ax
	ret
;
;	���������� ���������� ����������
;	--------------------------------
; ������: Tabl - ������� ������������ ����-����� � �������� ASCII
;
KeyboardInterrupt:
;���������� ����������� ����������
	sti
;���������� � ����������� ����� ����������� ���������
	push	ax
	push	bx
	push	ds
;������ � ���������� ������� DS ��������, ������� ������������� ������-�������� ������ ����������� ����������
	mov	ax,cs
	mov	ds,ax
;������ �� ����� 60h �������� ����-����
	in	al,60h
	mov	bl,al
;��������� ���� 7 ����� 61h
	in	al,61h
	or	al,10000000b
	out	61h,al	
;����� ���� 7 ����� 61h
	in	al,61h
	and	al,01111111b
	out	61h,al	
	mov	al,bl
;���� ���� �������� ������� CapsLock, �� �������������� ����� ������� ����������, �����
	cmp	al,3ah
	jne	.M1
	not	byte [SK]
	jmp	.Exit
.M1:	cmp	al,0bah
	jne	.M2
	not	byte [SK]
	jmp	.Exit
;���� ���� ���������� �������, �� �����
.M2:	and	al,10000000b
	jnz	.Exit
;���� ����� �����, �� �����
	cmp	[N],byte Nmax
	jz	.Exit
;���� ����-��� ����������, �� �����
	mov	al,bl
	xor	bx,bx
	mov	bx,Tabl
.M3:	cmp	byte [bx],0h
	jz	.Exit
	cmp	al,[bx]
	je	.M4
	add	bx,3
	jmp	.M3
.M4:    cmp	byte [SK],0
	jz	.M5
	add	bx,2
	jmp	.M6
.M5:	inc	bx
;������������� ����-���� � ������ ASCII
.M6:	mov	al,[bx]
;������ ������� ASCII � ����� ��������
.M7:	call	WritingCharacterBuffer
	jc	.Exit
;����� "���" ����������� ������� �� �����
	call	CharacterOutput
;���� ���������� ������ ��� "������� �������", �� ���������� � ����� � ������� �� ����� ������ "������� ������"
	cmp	al,0dh
	jne	.Exit
	mov	al,0ah
	jmp	.M7
;�����
.Exit:	mov	al,20h		        ;������ ������� � ��������������� ���������
	out	20h,al			; ���������� ��� ���������� ����� ������������ ����������
	pop	ds
	pop	bx
	pop	ax	        	
	iret
;
;	�������������� ������� ����������
;	-------------------------------------
;�����: AL - 0 - ��������� �������������, 1-��������� ���������������
;
KeyboardDriverInit:                    
        push	ax
	push	bx
	push	dx
	push	es
	push	ds
	cmp	al,0			;���� �� ����� AL = 0 �� ���������
	jnz	.M1			; �������������, ����� ���������������
;���������� � �� �������� ����������� ������� ���������� � ������� 09h
	mov	ax,cs                   ;
	mov	ds,ax                   ;
	mov	ax,3509h                ;���������� �������� �����������
	int	21h			; ������� 09h � ��������� ES � BX
	mov	[Old],bx		;� �����
	mov	[Old+2],es		; � ���� Old
;������ ���������� ������ ����������� ���������� ���������� � ������ ���������� � ������� 09h
	mov	ax,2509h		;������ ���������� ������ �����������
	mov	dx,KeyboardInterrupt	; � ������ ����������
	int	21h			; � ������� 09h
	jmp	.Exit		        ;�����
;�������������� �������� ����������� ������� ���������� � ������� 09h
.M1:	mov	ax,cs                   ;
	mov	es,ax                   ;
	mov	ax,2509h		;������ ����������
	mov	ds,[es:Old+2]		; ������ �����������
	mov	dx,[es:Old]		; � ������ ����������
	int	21h			; � ������� 09h
;�����
.Exit:	pop	ds
	pop	es
	pop	dx
	pop	bx
	pop	ax
	ret
;
;	������� ����-����� ������
;	-------------------------
;
Tabl	db	02h, '1', '!'
	db	03h, '2', '@'
	db	04h, '3', '#'
	db	05h, '4', '$'
	db	06h, '5', '%'
	db	07h, '6', '^'
	db	08h, '7', '&'
	db	09h, '8', '*'
	db	0ah, '9', '('
	db	0bh, '0', ')'
	db	0ch, '-', '_'
	db	0dh, '=', '+'
	db	10h, 'q', 'Q'
	db	11h, 'w', 'W'
	db	12h, 'e', 'E'
	db	13h, 'r', 'R'
	db	14h, 't', 'T'
	db	15h, 'y', 'Y'
	db	16h, 'u', 'U'
	db	17h, 'i', 'I'
	db	18h, 'o', 'O'
	db	19h, 'p', 'P'
	db	1ah, '[', '{'
	db	1bh, ']', '}'
	db	1ch, 0dh, 0dh
	db	1eh, 'a', 'A'
	db	1fh, 's', 'S'
	db	20h, 'd', 'D'
	db	21h, 'f', 'F'
	db	22h, 'g', 'G'
	db	23h, 'h', 'H'
	db	24h, 'j', 'J'
	db	25h, 'k', 'K'
	db	26h, 'l', 'L'
	db	27h, ';', ':'
	db	28h, 27h, '"'
	db	2bh, '\', '|'
	db	2ch, 'z', 'Z'
	db	2dh, 'x', 'X'
	db	2eh, 'c', 'C'
	db	2fh, 'v', 'V'
	db	30h, 'b', 'B'
	db	31h, 'n', 'N'
	db	32h, 'm', 'M'
	db	33h, ',', '<'
	db	34h, '.', '>'
	db	35h, '/', '?'
	db	39h, ' ', ' '
	db	0h
